<?php
// +----------------------------------------------------------------------
// | 萤火商城系统 [ 致力于通过产品和服务，帮助商家高效化开拓市场 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 这不是一个自由软件，不允许对程序代码以任何形式任何目的的再发行
// +----------------------------------------------------------------------
// | Author: 萤火科技 <admin@yiovo.com>
// +----------------------------------------------------------------------
declare (strict_types=1);

namespace app\console\command;

use Exception;
use PDO;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\Config;

/**
 * 定时器 (Workerman)
 * 用于执行系统里的定时任务, 例如自动确认收货
 * 使用方法: 执行命令: php think init-database
 * Class Timer
 * @package app\common\command
 */
class InstallDatabaseTimer extends Command
{
	protected function configure()
	{
		// 指令配置
		$this->setName('install-database')
			->setDescription('初始化数据库');
	}

	/**
	 * 创建定时器
	 * @param Input $input
	 * @param Output $output
	 * @return int|void|null
	 */
	protected function execute(Input $input, Output $output)
	{
		if (!defined('INSTALL_PATH')) {
			define('INSTALL_PATH', str_replace('\\', '/', dirname(__FILE__, 4) . '/public/install'));
		}
		if (!defined('ROOT_PATH')) {
			define('ROOT_PATH', dirname(INSTALL_PATH, 2));
		}

		$config = Config::get('database.connections.mysql');

		// 初始化信息
		$dbhost = $config['hostname'] ?? '';
		$dbname = $config['database'] ?? '';
		$dbuser = $config['username'] ?? '';
		$dbpwd = $config['password'] ?? '';
		$dbport = $config['hostport'] ?? 3306;

		// 连接证数据库
		try {
			$dsn = "mysql:host={$dbhost};port={$dbport};charset=utf8";
			$pdo = new PDO($dsn, $dbuser, $dbpwd);
			$pdo->query("SET NAMES utf8"); // 设置数据库编码
		} catch (Exception $e) {
			throw new Exception("数据库连接错误，请检查！");
//			$this->output->error('数据库连接错误，请检查！');
		}

		// 查询数据库
		$res = $pdo->query('show Databases');

		// 遍历所有数据库，存入数组
		$dbnameArr = [];
		foreach ($res->fetchAll(PDO::FETCH_ASSOC) as $row) {
			$dbnameArr[] = $row['Database'];
		}

		// 检查数据库是否存在，没有则创建数据库
		if (in_array(trim($dbname), $dbnameArr)) {
			$this->output->info('数据库已存在！');
			return;
		}

		if (!$pdo->exec("CREATE DATABASE `$dbname`")) {
			throw new Exception("创建数据库失败，请检查权限或联系管理员！");
		}

		// 数据库创建完成，开始连接
		$pdo->query("USE `$dbname`");
		$this->output->info('数据库连接文件创建完成！');

		// 创建表结构
		$this->output->info('准备创建数据库结构。');
		$tbstruct = $this->readDataFile('install_struct.sql');
		$pdo->exec(trim($tbstruct));
		$this->output->info('数据库结构导入完成！');

		// 导入其他安装数据
		$this->output->info('准备导入商城默认数据。');
		$data_str = $this->readDataFile('install_data.sql');
		$pdo->exec(trim($data_str));
		$this->output->info('商城默认数据导入完成！');
	}

	// 获取data文件夹中的文件内容
	function readDataFile(string $file)
	{
		return file_get_contents(INSTALL_PATH . '/data/' . $file);
	}
}

